#include <iostream>
#include <string>
#include <memory>
#include <conio.h>
using namespace std;

class R
{
public:
	R() :label("default") {  init(); }
	R(const string& alabel) :label(alabel) { init(); }
	~R() { cout << "R(" << label << ") destructor\n"; }
	void setLabel(const string& label) { this->label = label; }
private:
	void init()  { cout << "R(" << label << ") constructor\n"; }
	std::string label;
};

int main()
{
	{
		R r;
		shared_ptr<R> spr(new R("shared"));
		shared_ptr<R> spr2(spr);
		{
			shared_ptr<R> spr3 = spr;
			cout << "(i) out of scope\n";
		}
		

		auto_ptr<R> apr(new R("auto"));
		auto_ptr<R> apr2(apr);
		{
			auto_ptr<R> apr3 = apr;
			cout << "(i) out of scope\n";
		}
	}
	getch();
	return 0;
}